#在Backtrader框架中，将RSI策略、MACD策略和量化价值投资策略的原理融合到一个策略中，可以通过综合这些指标的信号来做出更全面的交易决策。以下是一个示例，展示了如何结合这三个策略的逻辑来创建一个复合策略：
from datetime import datetime

import backtrader as bt
import pandas as pd

from utils.BaoStockPandasData import BaoStockPandasData
from utils.DataSource import get_stock_data2


class CombinedStrategy(bt.Strategy):
    params = (
        ('rsi_period', 14),  # RSI周期
        ('oversold_rsi', 30),  # RSI超卖阈值
        ('overbought_rsi', 70),  # RSI超买阈值
        ('macd_fast', 12),  # MACD快速EMA周期
        ('macd_slow', 26),  # MACD慢速EMA周期
        ('macd_signal', 9),  # MACD信号线周期
        ('value_investing_threshold', 1.5),  # 价值投资PE比率阈值
        ('order_percentage', 0.95),  # 交易资金占总资金的百分比
    )

    def __init__(self):
        self.data_close = self.datas[0].close
        self.order = None
        self.rsi = bt.indicators.RSI_Safe(self.data.close, period=self.params.rsi_period)
        self.macd = bt.indicators.MACDHisto(self.data.close,
                                           period_me1=self.params.macd_fast,
                                           period_me2=self.params.macd_slow,
                                           period_signal=self.params.macd_signal)
        # 假设价值投资部分基于PE比率，这里需要实际数据源支持，示例中不包含PE数据处理
        # self.pe_ratio = ...  # 实际应用中需要从数据源中获取PE比率数据

    def next(self):
        if self.order:
            return  # 如果有订单在执行，则不执行新的买卖操作

        # 综合判断逻辑
        # 示例中简化处理，实际应用中需根据具体逻辑调整
        rsi_signal = self.rsi[0] < self.params.oversold_rsi or self.rsi[0] > self.params.overbought_rsi
        macd_signal = self.macd.histo[0] < 0 < self.macd.histo[-1] or self.macd.histo[0] > 0 > self.macd.histo[-1]
        # value_investing_signal = self.pe_ratio < self.params.value_investing_threshold  # 假设低PE为买入信号，需实际数据支持

        # 同时满足RSI和MACD信号时执行操作
        if rsi_signal and macd_signal:  # 可根据需求调整为或逻辑
            if not self.position:  # 无持仓，考虑买入
                amount_to_invest = (self.params.order_percentage * self.broker.cash) / self.data_close[0]
                self.buy(size=amount_to_invest)
                self.log(f"BUY EXECUTED --- Price: {self.data_close[0]}, RSI: {self.rsi[0]}, MACD Hist: {self.macd.hist[0]}")
            else:  # 有持仓，考虑卖出
                self.sell()
                self.log(f"SELL EXECUTED --- Price: {self.data_close[0]}, RSI: {self.rsi[0]}, MACD Hist: {self.macd.hist[0]}")

    def log(self, txt, dt=None):
        ''' Logging function for this strategy'''
        dt = dt or self.datas[0].datetime.date(0)
        print('%s, %s' % (dt.isoformat(), txt))

    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            return  # 订单状态未最终确定，等待

        if order.status in [order.Completed]:
            if order.isbuy():
                self.log(f"BUY EXECUTED --- Price: {order.executed.price}, Cost: {order.executed.value}, Commission: {order.executed.comm}")
            else:  # Sell
                self.log(f"SELL EXECUTED --- Price: {order.executed.price}, Size: {order.executed.size}, Commission: {order.executed.comm}")

        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log('Order Canceled/Margin/Rejected')

        self.order = None

# 回测设置示例
if __name__ == '__main__':
    cerebro = bt.Cerebro()

    # 假设已经通过某种方式（如Yahoo Finance）获取了数据
    df = get_stock_data2("sz.000001", "2020-01-01", "2023-12-31")
    data = BaoStockPandasData(dataname=df)
    cerebro.adddata(data)

    cerebro.adddata(data)

    cerebro.addstrategy(CombinedStrategy, 
                        rsi_period=14, 
                        oversold_rsi=30, 
                        overbought_rsi=70, 
                        macd_fast=12, 
                        macd_slow=26, 
                        macd_signal=9,
                        value_investing_threshold=1.5)

    cerebro.broker.setcash(100000.0)
    cerebro.broker.set_coc(True)  # 现金交易模式

    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
    cerebro.run()
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
    
#请注意，上述示例为了简洁，没有直接实现量化价值投资策略中的PE比率分析，因为这通常需要额外的数据源或自定义数据处理器来提供市盈率（PE Ratio）等财务数据。在实际应用中，你需要根据具体的金融数据源来添加这部分逻辑。此外，策略中的逻辑（如同时满足RSI和MACD信号才执行交易）是一种简化的处理方式，你可以根据实际情况调整各策略间的逻辑关系（如并行使用、加权决策等）。